package com.itheima.api.stream.demo04;

import java.util.ArrayList;

/**
 * <R> Stream<R> map(Function mapper)		返回由给定函数应用于此流的元素的结果组成的流
 * IntStream mapToInt(ToIntFunction mapper)返回一个IntStream其中包含将给定函数应用于此流的元素的结果
 */
public class StreamDemo01 {

    public static void main(String[] args) {

        // 1. 创建一个ArrayList集合对象
        ArrayList<Integer> arrayList = new ArrayList<Integer>() ;

        // 2. 添加元素
        arrayList.add(23) ;
        arrayList.add(34) ;
        arrayList.add(12) ;
        arrayList.add(20) ;

        // 3. 生成流
        // arrayList.stream(): 我们所获取的流对象中的元素类型和arrayList集合对象中的元素类型是一致的都是Integer类型
        // Function是一个接口，在该接口中存在一个抽象方法就是：R apply(T t); 该方法是有参数和返回值，并且参数的类型和返回值的类型不相同
        // 我们在调用这个map方法的时候可以为其传递一个Function这个接口所对应的lambda表达式，那么传递过来以后，jdk底层就会调用这个apply方法
        // 在调用这个方法的时候，会把流中的元素作为方法的参数传递过来，我们获取到这个参数以后，就可以进行一系列的操作，操作完毕以后我们需要为其返回
        // 一个值， 而这个返回值的类型可以与参数的类型不同 ，因此这个Function主要的作用就是去完成数据类型的转换
        arrayList.stream().map( (s) -> {

            // 把int类型的数据转换成字符字符串
            String s1 = String.valueOf(s);

            // 返回
            return s1 ;

        }).forEach( s -> System.out.println(s));

        System.out.println("-------------------------------------------------------");

        // IntStream mapToInt(ToIntFunction mapper)返回一个IntStream其中包含将给定函数应用于此流的元素的结果
        /**
         * ToIntFunction: 是一个函数式接口，在该接口中存在一个方法 int applyAsInt(T value); 这个抽象方法的主要作用就是把我们指定数据类型的数据转换成int类型
         */
        // arrayList.stream().map( s -> String.valueOf(s)): 这一步操作完毕以后，流中的类型已近是String类型
        arrayList.stream().map( s -> String.valueOf(s)).mapToInt( (s) -> {
            int parseInt = Integer.parseInt(s);
            parseInt = parseInt + 10;
            return parseInt ;
        }).forEach( s -> System.out.println(s));
    }

}
